#pragma once

// 形成守护进程
// 首先要保证自己不是组长
// 1.忽略异常信号， 2.三个文件描述符可能需要更改 3.可能需要更改工作路径

#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "log.hpp"
#include "err.hpp"

void daemon()
{
    signal(SIGPIPE, SIG_IGN); // 忽略异常信号避免程序直接退出
    signal(SIGCHLD, SIG_IGN);

    if (fork() > 0) // 避免自己成为组长
        exit(0);
    pid_t ret = setsid(); // 新建会话
    if ((int)ret == -1)
    {
        logmessage(FATAL, "daemon error,code: %d, string: %s", errno, strerror(errno));
        exit(SETSID_ERR);
    }

    // 更改工作路径
    // chdiR("/");

    // 处理后序对0 1 2的关系
    int fd = open("/dev/null", O_RDWR);
    if(fd < 0)
    {
        logmessage(FATAL, "open error,code: %d, string: %s", errno, strerror(errno));
        exit(OPEN_ERR);
    }
    dup2(fd,0);
    dup2(fd,1);
    dup2(fd,2);
    close(fd);
}